#include <REGX51.H>
#include "stdio.h"
sbit DS18B20_DQ = P3^7;

unsigned char DS18B20_Init()
{
	unsigned char i;
	unsigned char ackBit;

	DS18B20_DQ = 1;
	DS18B20_DQ = 0;
	i = 247;
	while (--i);	 //延时500us
	DS18B20_DQ = 1;
	i = 32;
	while (--i);
	ackBit = DS18B20_DQ;
	i = 247;
	while (--i);	 //延时500us
	return ackBit;
}

//发送一位
void ds18b20_write_bit(unsigned char bits)
{ 
	unsigned char i;
	DS18B20_DQ = 0;
	i = 4;
	while (--i); //延时10us
	DS18B20_DQ = bits;
	i = 24;
	while (--i); //延时50us
	DS18B20_DQ = 1;
}

//接收一位
unsigned char ds18b20_read_bit()
{ 
	unsigned char i;
	unsigned char bits;
	DS18B20_DQ = 0;
	i = 2;
	while (--i); //延时5us
	DS18B20_DQ = 1;
	i = 2;
	while (--i); //延时5us
	bits = DS18B20_DQ;
	i = 24;
	while (--i); //延时50us
	return bits;
}

//发送字节
void ds18b20_write_byte(unsigned char byte)
{
	unsigned char i;
	for(i = 0;i<8;i++)
	{
		ds18b20_write_bit(byte & 0x01<<i);//先发送低位
	}
}

unsigned char ds18b20_read_byte()
{
	unsigned char i;
	unsigned char byte = 0x00;
	for(i = 0;i<8;i++)
	{
		if(ds18b20_read_bit())
		{
			byte |= 0x01<<i;	
		}
	}
	return byte;	
}

//转换温度
void ds18b20_ConvertT()
{
	DS18B20_Init();
	ds18b20_write_byte(0xCC);
	ds18b20_write_byte(0x44);
}

//读取温度
float ds18b20_ReadT()
{
	unsigned char byteL;
	unsigned char byteH;
	int temp;
	float T;
	DS18B20_Init();
	ds18b20_write_byte(0xCC);
	ds18b20_write_byte(0xBE);
	byteL = ds18b20_read_byte();//低字节
	byteH = ds18b20_read_byte();//高字节
	temp = (byteH << 8) | byteL;
	T = temp / 16.0;
	return T;
}

/* 串口初始化 */
void UART_Init() {
    // 波特率发生器配置
    TMOD = 0x20;       // 定时器1工作模式2（自动重装）
    TH1 = TL1 = 243;
    

    // 串口模式配置
    SCON = 0x50;       // 模式1（8位UART），允许接收
    PCON = 0x80;      // 禁用波特率倍增

	TR1 = 1;           // 启动定时器1
    ES = 1;            // 使能串口中断
    EA = 1;            // 全局中断使能
}

/* 发送单个字符 */
void UART_SendChar(char c) {
    SBUF = c;
    while(!TI);        // 等待发送完成
    TI = 0;            // 清除标志
}

/* 发送字符串 */
void UART_SendStr(char *s) {
    while(*s) {
        UART_SendChar(*s++);
    }
}

unsigned char ack = 1;

float g_T;

void main()
{
	char temp_buff[50];
	UART_Init();
	UART_SendStr("Test started!\r\n");
	ack = DS18B20_Init();

	if (ack == 0){
		UART_SendStr("everything done!\r\n");
	}
	
	while(1)
	{
		ds18b20_ConvertT();
		g_T = ds18b20_ReadT();
	    // 使用 sprintf 将浮点数转换为字符串
	    sprintf(temp_buff, "%.3f\r\n", g_T);
		UART_SendStr(temp_buff);
	}
}
